package com.qf.rabbitmq.direct;


import com.qf.rabbitmq.util.ConnectionUtil;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ReturnListener;


import java.io.IOException;
import java.nio.charset.StandardCharsets;

/*
 * 一个生产者对应一个队列    一个队列对应一个消费者
 *  多个消费者对应一个队列是    也只是一个消费者在处理
 *
*/


//发送者
public class Sender4 {

//    声明了一个 交换机
    private static final String EXCHANGENAME="yufyufufiwwx";

    public static void main(String[] args) throws Exception  {

//        获取连接
        Connection connection = ConnectionUtil.getConnection();

            //       通过连接  创建通道
            Channel channel = connection.createChannel();
//            声明交换机
            channel.exchangeDeclare(EXCHANGENAME, "fanout");
//            开启查看消息是否发送成功    确认机制
            channel.confirmSelect();
//            confirm 只能保证消息到达服务器交换机上面 不能保证消息一定到了队列 所以可能出现情况  消息丢失
//          return  是指的如果消息没有 送达就返回  也就是一旦受到返回的信息就意味着消息没有送达到指定的队列  消息会丢失
            channel.addReturnListener(new ReturnListener() {
                @Override
                public void handleReturn(int i, String s, String s1, String s2, AMQP.BasicProperties basicProperties, byte[] bytes) throws IOException {
                    System.out.println("消息没有送到队列");
                }
            });
//      发送  1交换机    2队列名字   3  附加属性  4 要发送的内容
            for (int i = 0; i < 100; i++) {
//              如果使用return 机制 需要将mandatory   设置为true
//                channel.basicPublish(EXCHANGENAME, "", true, null,("你在说什么啊呢"+i).getBytes(StandardCharsets.UTF_8));
                channel.basicPublish(EXCHANGENAME,"",true,null,("发送到交换机上面的数据" + i).getBytes(StandardCharsets.UTF_8));

            }
//        如果没有用了 关闭连接
//            channel.close();
//            connection.close();


    }
}




